[小ネタ]Webhookイベントを使ってメッセージ送信用ユーザーIDのDBを作る #LINE_API
こんにちは、中村です。気づけば1月も今日で終わりですね。早く春が来てほしいです。
さて、今月最後はLINE Messaging APIのメッセージ送信関連tipsです。 Messaging APIの中には応答メッセージだけでなく、プッシュメッセージを送る・複数のユーザーにメッセージを送る(マルチキャスト)機能があります。この機能を利用するには、userId, groupId, roomIdのどれかが必要になります。
Botをグループやトークルームに入れて利用する場合は、groupIdやroomIdを使ってAPIでuserIDを取得できますが、Botと1対1の場合はwebhookのイベントをもとにuserIdを取得しておく必要がありそうです。(現時点でchannelに紐づくユーザーを取得するAPIはありません。)今回はwebhookイベントを利用してDynamoDBに格納しておきます。
はじめに
Webhookイベントオブジェクトにはいくつかのタイプがあります。userId取得にはフォローイベントとフォロー解除イベントを利用します。 まず、下記の共通のプロパティがあります。
共通プロパティ
プロパティ名 | タイプ | 説明 |
---|---|---|
type | String | イベントタイプを表す識別子 |
timestamp | Number | イベント発生時刻(ミリ秒) |
source | Object | イベントの送信元情報を含むユーザー、グループ、またはトークルームオブジェクト |
ユーザーオブジェクト
プロパティ名 | タイプ | 説明 |
---|---|---|
type | String | user |
userId | String | 送信元のユーザーID |
上記に加えて、フォローイベントとフォロー解除イベントは下記のプロパティがあります。
フォローイベント
プロパティ名 | タイプ | 説明 |
---|---|---|
type | String | follow |
replyToken | String | イベントへの応答に使用するトークン |
フォロー解除イベント
プロパティ名 | タイプ | 説明 |
---|---|---|
type | String | unfollow |
実装してみる
LINEからリクエストされるWebhookは、API GatewayとLambdaで構築していきます。LambdaではじめてのLINE Botを作るを参考にしましょう。またLambdaのロールでは、DynamoDBへの書き込み権限を付与が必要です。
簡単ですが、実際のDynamoDBへの書き込み部分はこのような形になります。
let eventType: string = event.events[0].type; let userId: string = event.events[0].source.userId; let timestamp: number = event.events[0].timestamp; switch (eventType) { : : : : case "follow": let putOption: Aws.DynamoDB.DocumentClient.PutItemInput = { "TableName": "user", "Item": { "userId": userId, "timestamp": timestamp } }; let putResult: Aws.DynamoDB.DocumentClient.PutItemOutput = await DynamoDB.put(putOption).promise(); console.log(JSON.stringify(putResult)); break; case "unfollow": let deleteOption: Aws.DynamoDB.DocumentClient.DeleteItemInput = { "TableName": "user", "Key": { "userId": userId } }; let deleteResult: Aws.DynamoDB.DocumentClient.DeleteItemOutput = await DynamoDB.delete(deleteOption).promise(); console.log(JSON.stringify(deleteResult)); break; : : : : }
実際にBotを追加するとLambdaまでリクエストされ、DynamoDBにデータが書き込まれていると思います。LINE上でブロックすることで、データは消すことができます。
Lambdaには、このような形でJSONが飛んできています。
フォローイベント
{ "events": [ { "type": "follow", "replyToken": "78b3bf0156a24572a6f87a37c06b23cc", "source": { "userId": "xxxxxxxxxxxxxx", "type": "user" }, "timestamp": 1548919221641 } ], "destination": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx" }
フォロー解除イベント
{ "events": [ { "type": "unfollow", "source": { "userId": "xxxxxxxxxxxxxx", "type": "user" }, "timestamp": 1548919288104 } ], "destination": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx" }
このような簡単な実装でプッシュメッセージやマルチキャストを行う際に使える、ユーザーDBができました。
まとめ
いかがでしたでしょうか。 仕組みは簡単ですが、LINEへのメッセージ送信をLINE@以外から行う場合に使えそうです。
弊社では、「Amazon Connect」の導入を検討している方を対象とした無料相談会を毎週開催中です。
また音声を中心とした各種ソリューションの開発支援も行なっております。